#include <iostream>
using namespace std;
const int N = 20;

int n;
int g[N][N];                        // 坐标
bool row[N], col[N], dg[N], udg[N]; // 同列，同对角线，同反对角线

void dfs(int x, int y, int s) // 对每一行进行搜索
{
    if (y == n)
        y = 0, x++; // 换到下一行的第一个点进行搜索
    
    if (x == n)  //一行遍历完，输出
    {
        if (s == n)
        {
            for (int i = 0; i < n; i++)
                puts(g[i]);
            puts("");
        }
        return;
    }

    // 不放皇后
    dfs(x, y + 1, s);  //换行下一个

    // 放皇后
    if (!row[x] && !col[y] && !dg[x + y] && !udg[x - y + n])
    {
        g[x][y] = 'Q';
        row[x] = col[y] = dg[x + y] = udg[x - y + n] = true;
        dfs(x, y + 1, s + 1);
        row[x] = col[y] = dg[x + y] = udg[x - y + n] = false;
        g[x][y] = '.';
    }
}
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++) // 将每个点赋初值为.
        for (int j = 0; j < n; j++)
            g[i][j] = '.';

    dfs(0, 0, 0); // 从位置为0,0的点开始搜索，当前皇后数为0
    return 0;
}
